﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using IUAP;
using IUAP.BLL.Articulo;
using System.Security;
using System.Web.Security;

public partial class PagComunes_VerArticulos : BasePage
{
    private bool userCanEdit = false;
    protected bool UserCanEdit
    {
        get { return userCanEdit; }
        set { userCanEdit = value; }
    }
    int id_articulo = 0;
    protected void Page_Init(object sender, EventArgs e)
    {
        UserCanEdit = (this.User.Identity.IsAuthenticated &&
           (this.User.IsInRole("Administrador") || this.User.IsInRole("Moderador")));
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(this.Request.QueryString["ID"]))
            throw new ApplicationException("Parámetro que falta en la cadena de consulta.");
        else
            id_articulo = int.Parse(this.Request.QueryString["ID"]);

        if (!this.IsPostBack)
        {
            // Tratar de cargar el artículo con el ID especificado, y lanzará una excepción
            // Si no existe
            Articulo articulo = Articulo.GetArticleByID(id_articulo);
            if (articulo == null)
                throw new ApplicationException("No se encontró ningún artículo con el id especificado");

            // Comprobar si el artículo se publica (aprobado, publicado y no ha caducado aún).
            // Si no, continuará sólo si el usuario actual es un administrador o un editor
            if (!articulo.Publicado)
            {
                if (!this.UserCanEdit)
                {
                    throw new SecurityException(@"¿Qué estás tratando de hacer??
                   No se nos permite hacer ver este artículo!");
                }
            }

            // Si el artículo tiene el campo Solo_miem_arti = true, y el usuario actual es anónimo,
             // Redireccionar a la página de inicio
            if (articulo.Solo_miem_arti && !this.User.Identity.IsAuthenticated)
                this.RequestLogin();

            articulo.IncrementCantidadVisitas();

            // Si hemos llegado hasta aquí, muestra todos los datos del artículo en la página
            this.Title = string.Format(this.Title, articulo.Titu_arti);
            lblTitle.Text = articulo.Titu_arti;
            lblNotApproved.Visible = !articulo.Apro_arti;
            lblAddedBy.Text = articulo.Usuario;
            lblReleaseDate.Text = articulo.Fech_publ_arti.ToShortDateString();
            lblCategory.Text = articulo.Titu_cate;
            lblLocation.Visible = (articulo.Ciud_arti.Length > 0);
            if (lblLocation.Visible)
                lblLocation.Text = string.Format(lblLocation.Text, articulo.Ciud_arti);
            lblRating.Text = string.Format(lblRating.Text, articulo.Voto_arti);
            ratDisplay.Value = articulo.RatingMedio;
            ratDisplay.Visible = (articulo.Voto_arti > 0);
            lblViews.Text = string.Format(lblViews.Text, articulo.Cont_visi_arti);
            lblAbstract.Text = articulo.Resu_arti;
            lblBody.Text = articulo.Cont_arti;
            panComments.Visible = articulo.Actv_comn_arti;
            panEditArticle.Visible = this.UserCanEdit;
            btnApprove.Visible = !articulo.Apro_arti;
            lnkEditArticle.NavigateUrl = string.Format(lnkEditArticle.NavigateUrl, id_articulo);

            // hide the rating box controls if the current user has already voted for this article
            int userRating = GetUserRating();
            if (userRating > 0)
                ShowUserRating(userRating);
        }
    }
    protected void btnRate_Click(object sender, EventArgs e)
    {
        // check whether the user has already rated this article
        int userRating = GetUserRating();
        if (userRating > 0)
        {
            ShowUserRating(userRating);
        }
        else
        {
            // rate the article, then create a cookie to remember this user's rating
            userRating = ddlRatings.SelectedIndex + 1;
            Articulo.InsertVoto(id_articulo, userRating);
            ShowUserRating(userRating);

            HttpCookie cookie = new HttpCookie(
               "Rating_Articulo" + id_articulo.ToString(), userRating.ToString());
            cookie.Expires = DateTime.Now.AddDays(Globals.Settings.Articulo.RatingLockInterval);
            this.Response.Cookies.Add(cookie);
        }
    }

    protected void ShowUserRating(int rating)
    {
        lblUserRating.Text = string.Format(lblUserRating.Text, rating);
        ddlRatings.Visible = false;
        btnRate.Visible = false;
        lblUserRating.Visible = true;
    }

    protected int GetUserRating()
    {
        int rating = 0;
        HttpCookie cookie = this.Request.Cookies["Rating_Articulo" + id_articulo.ToString()];
        if (cookie != null)
            rating = int.Parse(cookie.Value);
        return rating;
    }
    protected void dlstComments_SelectedIndexChanged(object sender, EventArgs e)
    {
        dvwComment.ChangeMode(DetailsViewMode.Edit);
    }

    protected void dvwComment_ItemCommand(object sender, DetailsViewCommandEventArgs e)
    {
        if (e.CommandName == "Cancel")
        {
            dlstComments.SelectedIndex = -1;
            dlstComments.DataBind();
        }
    }
    protected void dvwComment_ItemInserted(object sender, DetailsViewInsertedEventArgs e)
    {
        dlstComments.SelectedIndex = -1;
        dlstComments.DataBind();
    }

    protected void dvwComment_ItemUpdated(object sender, DetailsViewUpdatedEventArgs e)
    {
        dlstComments.SelectedIndex = -1;
        dlstComments.DataBind();
    }
    protected void btnApprove_Click(object sender, ImageClickEventArgs e)
    {
        Articulo.AprobarArticulo(id_articulo);
        btnApprove.Visible = false;
    }

    protected void btnDelete_Click(object sender, ImageClickEventArgs e)
    {
        Articulo.DeleteArticle(id_articulo);
        this.Response.Redirect("BuscarArticulos.aspx", false);
    }
    protected void dlstComments_ItemCommand(object source, DataListCommandEventArgs e)
    {
        if (e.CommandName == "Delete")
        {
            int id_comentario = int.Parse(e.CommandArgument.ToString());
            Comentario.DeleteComment(id_comentario);
            dvwComment.ChangeMode(DetailsViewMode.Insert);
            dlstComments.SelectedIndex = -1;
            dlstComments.DataBind();
        }
    }
    protected void dvwComment_ItemCreated(object sender, EventArgs e)
    {
        // Cuando en el modo de inserción, antes de llenar el nombre de usuario y los campos de correo electrónico con la información del usuario 
        // actual, si se ha autenticado
        if (dvwComment.CurrentMode == DetailsViewMode.Insert &&
           this.User.Identity.IsAuthenticated)
        {
            MembershipUser userio = Membership.GetUser();
            (dvwComment.FindControl("txtAddedBy") as TextBox).Text = userio.UserName;
            (dvwComment.FindControl("txtAddedByEmail") as TextBox).Text = userio.Email;
        }
    }
}